home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
netz
/
term
/
extras
/
source
/
gtlayout-source.lha
/
LT_LockWindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-31
|
3KB
|
180 lines
/* GadTools layout toolkit
**
** Copyright © 1993-1995 by Olaf `Olsen' Barthel
** Freely distributable.
*/
#include "gtlayout_global.h"
VOID LIBENT
LT_LockWindow(REG(a0) struct Window *window)
{
if(window)
{
LockNode *lockNode;
BOOLEAN found;
found = FALSE;
ObtainSemaphore(<P_LockSemaphore);
SCANLIST(<P_LockList,lockNode)
{
if(lockNode -> Window == window)
{
lockNode -> Count++;
found = TRUE;
break;
}
}
if(!found)
{
if(lockNode = AllocMem(sizeof(LockNode),MEMF_PUBLIC | MEMF_ANY | MEMF_CLEAR))
{
AddTail((struct List *)<P_LockList,(struct Node *)lockNode);
lockNode -> Window = window;
lockNode -> OldIDCMPFlags = window -> IDCMPFlags;
lockNode -> Count = 1;
lockNode -> MinWidth = window -> MinWidth;
lockNode -> MaxWidth = window -> MaxWidth;
lockNode -> MinHeight = window -> MinHeight;
lockNode -> MaxHeight = window -> MaxHeight;
WindowLimits(window,window -> Width,window -> Height,window -> Width,window -> Height);
ModifyIDCMP(window,(window -> IDCMPFlags & ~IDCMP_REFRESHWINDOW) | IDCMP_SIZEVERIFY);
if(V39)
{
STATIC struct TagItem tags[3] =
{
WA_BusyPointer, TRUE,
WA_PointerDelay, TRUE,
TAG_DONE
};
SetWindowPointerA(window,tags);
}
else
{
STATIC UWORD __chip Stopwatch[(2 + 16) * 2] =
{
0x0000,0x0000,
0x0400,0x07C0,
0x0000,0x07C0,
0x0100,0x0380,
0x0000,0x07E0,
0x07C0,0x1FF8,
0x1FF0,0x3FEC,
0x3FF8,0x7FDE,
0x3FF8,0x7FBE,
0x7FFC,0xFF7F,
0x7EFC,0xFFFF,
0x7FFC,0xFFFF,
0x3FF8,0x7FFE,
0x3FF8,0x7FFE,
0x1FF0,0x3FFC,
0x07C0,0x1FF8,
0x0000,0x07E0,
0x0000,0x0000
};
SetPointer(window,Stopwatch,16,16,-6,0);
}
Request(&lockNode -> Requester,window);
}
}
ReleaseSemaphore(<P_LockSemaphore);
}
}
/****************************************************************************/
VOID LIBENT
LT_UnlockWindow(REG(a0) struct Window *window)
{
if(window)
{
LockNode *lockNode;
ObtainSemaphore(<P_LockSemaphore);
SCANLIST(<P_LockList,lockNode)
{
if(lockNode -> Window == window)
{
if(--lockNode -> Count < 1)
{
Remove((struct Node *)lockNode);
WindowLimits(window,lockNode -> MinWidth,lockNode -> MinHeight,lockNode -> MaxWidth,lockNode -> MaxHeight);
EndRequest(&lockNode -> Requester,window);
if(V39)
SetWindowPointerA(window,NULL);
else
ClearPointer(window);
ModifyIDCMP(window,lockNode -> OldIDCMPFlags);
FreeMem(lockNode,sizeof(LockNode));
}
break;
}
}
ReleaseSemaphore(<P_LockSemaphore);
}
}
/*****************************************************************************/
VOID LIBENT
LT_DeleteWindowLock(REG(a0) struct Window *window)
{
if(window)
{
LockNode *lockNode;
ObtainSemaphore(<P_LockSemaphore);
SCANLIST(<P_LockList,lockNode)
{
if(lockNode -> Window == window)
{
Remove((struct Node *)lockNode);
EndRequest(&lockNode -> Requester,window);
if(V39)
SetWindowPointerA(window,NULL);
else
ClearPointer(window);
ModifyIDCMP(window,lockNode -> OldIDCMPFlags);
FreeMem(lockNode,sizeof(LockNode));
break;
}
}
ReleaseSemaphore(<P_LockSemaphore);
}
}